package com.feng.study.pay;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.net.ssl.SSLContext;

import org.apache.commons.codec.digest.DigestUtils;

public class WeChatPayUtil {

    /**
     * 字符集编码
     */
    private static final String CHARSET_UTF8 = "UTF-8";

    /**
     * 随机字符集，用于生成随机字符串
     */
    private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    /**
     * 生成指定长度的随机字符串
     *
     * @param length 字符串长度
     * @return 返回生成的随机字符串
     */
    public static String generateNonceStr(int length) {
        StringBuilder sb = new StringBuilder(length);
        Random rnd = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(CHARACTERS.charAt(rnd.nextInt(CHARACTERS.length())));
        }
        return sb.toString();
    }

    /**
     * 将请求参数转换为XML格式
     *
     * @param reqData 请求参数
     * @return 返回XML格式的请求参数
     */
    public static String generateXML(Map<String, String> reqData) {
        StringBuilder sb = new StringBuilder("<xml>");
        for (Map.Entry<String, String> entry : reqData.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            if (value != null && !"".equals(value.trim())) {
                sb.append("<").append(key).append(">").append("<![CDATA[").append(value).append("]]></").append(key).append(">");
            }
        }
        sb.append("</xml>");
        return sb.toString();
    }

    /**
     * 对请求参数进行签名
     *
     * @param reqData 请求参数
     * @param apiKey  商户API密钥
     * @return 返回签名后的请求参数（包含签名字段）
     */
    public static Map<String, String> sign(Map<String, String> reqData, String apiKey) {
        // 按照ASCII码排序并组成待签名字符串
        String[] keys = reqData.keySet().toArray(new String[0]);
        Arrays.sort(keys);
        StringBuilder sb = new StringBuilder();
        for (String key : keys) {
            String value = reqData.get(key);
            if (value != null && !"".equals(value.trim())) {
                sb.append(key).append("=").append(value).append("&");
            }
        }
        sb.append("key=").append(apiKey);

        // 计算MD5摘要并返回结果
        String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase();
        reqData.put("sign", sign);
        return reqData;
    }

    /**
     * 发送HTTPS请求并返回响应结果
     *
     * @param host       请求的主机地址
     * @param path       请求路径
     * @param requestXml 请求参数的XML格式
     * @param certStream SSL证书文件的输入流
     * @return 返回响应结果的字符串形式
     * @throws Exception
     */
//    public static String requestSSL(String host, String path, String requestXml, InputStream certStream) throws Exception {
//        // 初始化SSLContext
//        KeyStore keyStore = KeyStore.getInstance("PKCS12");
//        keyStore.load(certStream, "".toCharArray());
//        SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, "".toCharArray()).build();
//
//        // 创建HttpsURLConnection并发送请求
//        URL url = new URL("https://" + host + path);
//        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
//        conn.setSSLSocketFactory(sslContext.getSocketFactory());
//        conn.setRequestMethod("POST");
//        conn.setRequestProperty("Content-Type", "application/xml;charset=UTF-8");
//        conn.setDoOutput(true);
//        OutputStream out = conn.getOutputStream();
//        out.write(requestXml.getBytes(CHARSET_UTF8));
//        out.flush();
//        out.close();
//    }
}
